package com.cyj.springbootservice.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * @description: 分页插件
 * <p>
 * <p>
 * EnableTransactionManagement 开启事务，等同于xml配置方式的 <tx:annotation-driven />
 * 在官方文档（https://mp.baomidou.com/guide/interceptor-optimistic-locker.html）中没有注册乐观锁插件，实际情况下如果不注册会报以下错误:
 * Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
 * [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException:
 * nested exception is org.apache.ibatis.binding.BindingException: Parameter 'MP_OPTLOCK_VERSION_ORIGINAL' not found. Available parameters are [param1, et]] with root cause
 * @Author C_Y_J
 * @create 2021-03-19 10:04
 **/
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {

    /**
     * 旧版 SQL执行效率插件
     * 该插件 3.2.0及以上版本移除
     * 推荐使用第三方扩展 执行SQL分析打印 功能
     *
     * @return
     */
//    @Bean
//    @Profile({"dev", "test"})
//    public PerformanceInterceptor performanceInterceptor() {
//        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
//        //设置sql执行的最大时间，如果超过了则不执行
//        performanceInterceptor.setMaxTime(200);
//        //是否格式化代码
//        performanceInterceptor.setFormat(true);
//        return performanceInterceptor;
//    }

    /**
     * 旧版 逻辑删除组件
     * 该插件 3.2.0及以上版本移除
     * {@link DefaultSqlInjector} 里面已集成逻辑删除功能,entity 内字段注解 {@link TableLogic} 即可开启
     *
     * @return
     */
//    @Bean
//    public ISqlInjector sqlInjector() {
//        return new LogicSqlInjector();
//    }


    /**
     * 旧版 分页插件
     *
     * @return
     */
//    @Bean
//    public PaginationInterceptor paginationInterceptor() {
//        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
//        // 设置请求的页面大于最大页后操作， true调回到首页，false 继续请求  默认false
////         paginationInterceptor.setOverflow(false);
//        // 设置最大单页限制数量，默认 500 条，-1 不受限制
////         paginationInterceptor.setLimit(500);
//        // 开启 count 的 join 优化,只针对部分 left join
////        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
//        return paginationInterceptor;
//    }


    /**
     * 新版 乐观锁拦截器
     *
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }

    /**
     * 旧版 乐观锁拦截器
     *
     * @return
     */
//    @Bean
//    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
//        return new OptimisticLockerInterceptor();
//    }
}
